sammy.bind('cores_load_data', function(event, params) {
	$.ajax({
		url : app.config.solr_path + app.config.core_admin_path + '?wt=json',
		dataType : 'json',
		beforeSend : function(xhr, settings) {},
		success : function(response, text_status, xhr) {
			if (params.only_failures) {
				app.check_for_init_failures(response);
				return true;
			}

			var has_cores = false;
			for (core in response.status) {
				has_cores = true;
				break;
			}

			app.set_cores_data(response);

			if (has_cores) {
				params.success(app.cores_data);
			} else {
				params.error();
			}
		},
		error : function(xhr, text_status, error_thrown) {},
		complete : function(xhr, text_status) {}
	});
});

sammy.bind('cores_build_navigation', function(event, params) {
	var navigation_content = [ '<ul>' ];

	for ( var core in params.cores) {
		var core_name = core;
		if (!core_name) {
			core_name = '<em>(empty)</em>';
		}
		navigation_content.push('<li><a href="' + params.basepath + core + '">' + core_name + '</a></li>');
	}

	params.navigation_element.html(navigation_content.join("\n"));
	$('a[href="' + params.basepath + params.current_core + '"]', params.navigation_element).parent().addClass('current');
});

sammy.bind('cores_load_template', function(event, params) {
	if (app.cores_template) {
		params.callback();
		return true;
	}

	$.get('tpl/cores.html', function(template) {
		params.content_element.html(template);

		app.cores_template = template;
		params.callback();
	});
});

// #/~cores
sammy.get(/^#\/(~cores)$/, function(context) {
	delete app.cores_template;
	var content_element = $('#content');

	sammy.trigger('cores_load_data', {
		success : function(cores) {
			var first_core = null;
			for ( var key in cores) {
				if (!first_core) {
					first_core = key;
				}
				continue;
			}
			context.redirect(context.path + '/' + first_core);
		},
		error : function() {
			sammy.trigger('cores_load_template', {
				content_element : content_element,
				callback : function() {
					var cores_element = $('#cores', content_element);
					var navigation_element = $('#navigation', cores_element);
					var data_element = $('#data', cores_element);
					var core_data_element = $('#core-data', data_element);
					var index_data_element = $('#index-data', data_element);

					// layout

					var ui_block = $('#ui-block');
					var actions_element = $('.actions', cores_element);
					var div_action = $('div.action', actions_element);

					ui_block.css('opacity', 0.7).width(cores_element.width() + 10).height(cores_element.height());

					if ($('#cloud.global').is(':visible')) {
						$('.cloud', div_action).show();
					}

					$('button.action', actions_element).die('click').live('click', function(event) {
						var self = $(this);

						self.toggleClass('open');

						$('.action.' + self.attr('id'), actions_element).trigger('open');

						return false;
					});

					div_action.die('close').live('close', function(event) {
						div_action.hide();
						ui_block.hide();
					}).die('open').live('open', function(event) {
						var self = $(this);
						var rel = $('#' + self.data('rel'));

						self.trigger('close').show().css('left', rel.position().left);

						ui_block.show();
					});

					$('form button.reset', actions_element).die('click').live('click', function(event) {
						$(this).closest('div.action').trigger('close');
					});

					$('form', div_action).ajaxForm({
						url : app.config.solr_path + app.config.core_admin_path + '?wt=json&indexInfo=false',
						dataType : 'json',
						beforeSubmit : function(array, form, options) {
							$('button[type="submit"] span', form).addClass('loader');
						},
						success : function(response, status_text, xhr, form) {
							delete app.cores_data;
							sammy.refresh();

							$('button.reset', form).trigger('click');
						},
						error : function(xhr, text_status, error_thrown) {
							var response = null;
							eval('response = ' + xhr.responseText + ';');

							var error_elem = $('.error', div_action.filter(':visible'));
							error_elem.show();
							$('span', error_elem).text(response.error.msg);
						},
						complete : function() {
							$('button span.loader', actions_element).removeClass('loader');
						}
					});

					// --

					$('#add', content_element).trigger('click');

					$('[data-rel="add"] input[type="text"]:first', content_element).focus();
				}
			});
		}
	});
});

// #/~cores
sammy.get(/^#\/(~cores)\//, function(context) {
	var content_element = $('#content');

	var path_parts = this.path.match(/^(.+\/~cores\/)(.*)$/);
	var current_core = path_parts[2];

	sammy.trigger('cores_load_data', {
		error : function() {
			context.redirect('#/' + context.params.splat[0]);
		},
		success : function(cores) {
			sammy.trigger('cores_load_template', {
				content_element : content_element,
				callback : function() {
					var cores_element = $('#cores', content_element);
					var navigation_element = $('#navigation', cores_element);
					var data_element = $('#data', cores_element);
					var core_data_element = $('#core-data', data_element);
					var index_data_element = $('#index-data', data_element);

					cores_element.removeClass('empty');

					sammy.trigger('cores_build_navigation', {
						cores : cores,
						basepath : path_parts[1],
						current_core : current_core,
						navigation_element : navigation_element
					});

					var core_data = cores[current_core];
					var core_basepath = $('#' + current_core, app.menu_element).attr('data-basepath');
					// core-data
					$('.startTime dd', core_data_element).html(core_data.startTime);
					$('.instanceDir dd', core_data_element).html(core_data.instanceDir);
					$('.dataDir dd', core_data_element).html(core_data.dataDir);
					// index-data
					$('.lastModified dd', index_data_element).html(core_data.index.lastModified || '-');
					$('.version dd', index_data_element).html(core_data.index.version);
					$('.numDocs dd', index_data_element).html(core_data.index.numDocs);
					$('.maxDoc dd', index_data_element).html(core_data.index.maxDoc);
					$('.deletedDocs dd', index_data_element).html(core_data.index.deletedDocs || '-');
					$('.optimized dd', index_data_element).addClass(!core_data.index.hasDeletions ? 'ico-1' : 'ico-0');
					$('#actions #optimize', cores_element).show();
					$('.optimized dd span', index_data_element).html(!core_data.index.hasDeletions ? 'yes' : 'no');
					$('.current dd', index_data_element).addClass(core_data.index.current ? 'ico-1' : 'ico-0');
					$('.current dd span', index_data_element).html(core_data.index.current ? 'yes' : 'no');
					$('.directory dd', index_data_element).html(core_data.index.directory.replace(/:/g, ':&#8203;').replace(/@/g, '@&#8203;'));

					var core_names = [];
					var core_selects = $('#actions select', cores_element);
					for ( var key in cores) {
						core_names.push('<option value="' + key + '">' + key + '</option>')
					}
					core_selects.html(core_names.join("\n"));
					$('option[value="' + current_core + '"]', core_selects.filter('.other')).remove();
					$('input[data-core="current"]', cores_element).val(current_core);
					// layout

					var ui_block = $('#ui-block');
					var actions_element = $('.actions', cores_element);
					var div_action = $('div.action', actions_element);
					ui_block.css('opacity', 0.7).width(cores_element.width() + 10).height(cores_element.height());
					if ($('#cloud.global').is(':visible')) {
						$('.cloud', div_action).show();
					}
					$('button.action', actions_element).die('click').live('click', function(event) {
						var self = $(this);
						self.toggleClass('open');
						$('.action.' + self.attr('id'), actions_element).trigger('open');
						return false;
					});

					div_action.die('close').live('close', function(event) {
						div_action.hide();
						ui_block.hide();
					}).die('open').live('open', function(event) {
						var self = $(this);
						var rel = $('#' + self.data('rel'));
						self.trigger('close').show().css('left', rel.position().left);
						ui_block.show();
					});

					$('form button.reset', actions_element).die('click').live('click', function(event) {
						$(this).closest('div.action').trigger('close');
					});

					var form_callback = {
						rename : function(form, response) {
							var url = path_parts[1] + $('input[name="other"]', form).val();
							context.redirect(url);
						}
					};

					$('form', div_action).ajaxForm({
						url : app.config.solr_path + app.config.core_admin_path + '?wt=json&indexInfo=false',
						dataType : 'json',
						beforeSubmit : function(array, form, options) {
							$('button[type="submit"] span', form).addClass('loader');
						},
						success : function(response, status_text, xhr, form) {
							var action = $('input[name="action"]', form).val().toLowerCase();
							delete app.cores_data;
							if (form_callback[action]) {
								form_callback[action](form, response);
							} else {
								sammy.refresh();
							}

							$('button.reset', form).trigger('click');
						},
						error : function(xhr, text_status, error_thrown) {
							var response = null;
							eval('response = ' + xhr.responseText + ';');

							var error_elem = $('.error', div_action.filter(':visible'));
							error_elem.show();
							$('span', error_elem).text(response.error.msg);
						},
						complete : function() {
							$('button span.loader', actions_element).removeClass('loader');
						}
					});

					var reload_button = $('#actions #reload', cores_element);
					reload_button.die('click').live('click', function(event) {
						$.ajax({
							url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=RELOAD&core=' + current_core,
							dataType : 'json',
							context : $(this),
							beforeSend : function(xhr, settings) {
								$('span', this).addClass('loader');
							},
							success : function(response, text_status, xhr) {
								this.addClass('success');

								delete app.cores_data;
								sammy.refresh();

								window.setTimeout(function() {
									reload_button.removeClass('success');
								}, 1000);
							},
							error : function(xhr, text_status, error_thrown) {
								this.addClass('warn');

								sammy.trigger('cores_load_data', {
									only_failures : true
								});

								window.setTimeout(function() {
									reload_button.removeClass('warn');
								}, 1000);
							},
							complete : function(xhr, text_status) {
								$('span', this).removeClass('loader');
							}
						});
					});

					$('#actions #unload', cores_element).die('click').live('click', function(event) {
						var ret = confirm('Do you really want to unload Core "' + current_core + '"?');
						if (!ret) {
							return false;
						}

						$.ajax({
							url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=UNLOAD&core=' + current_core,
							dataType : 'json',
							context : $(this),
							beforeSend : function(xhr, settings) {
								$('span', this).addClass('loader');
							},
							success : function(response, text_status, xhr) {
								delete app.cores_data;
								context.redirect(path_parts[1].substr(0, path_parts[1].length - 1));
							},
							error : function(xhr, text_status, error_thrown) {},
							complete : function(xhr, text_status) {
								$('span', this).removeClass('loader');
							}
						});
					});

					var optimize_button = $('#actions #optimize', cores_element);
					optimize_button.die('click').live('click', function(event) {
						$.ajax({
							url : core_basepath + '/update?optimize=true&waitFlush=true&wt=json',
							dataType : 'json',
							context : $(this),
							beforeSend : function(xhr, settings) {
								$('span', this).addClass('loader');
							},
							success : function(response, text_status, xhr) {
								this.addClass('success');

								window.setTimeout(function() {
									optimize_button.removeClass('success');
								}, 1000);

								$('.optimized dd.ico-0', index_data_element).removeClass('ico-0').addClass('ico-1');
							},
							error : function(xhr, text_status, error_thrown) {
								console.warn('d0h, optimize broken!');
							},
							complete : function(xhr, text_status) {
								$('span', this).removeClass('loader');
							}
						});
					});

					$('.timeago', data_element).timeago();

					$('ul', data_element).each(function(i, element) {
						$('li:odd', element).addClass('odd');
					})
				}
			});
		}
	});
});